package org.study.r2dbc.boot.service;

import org.study.r2dbc.boot.model.User;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.math.BigDecimal;
import java.util.List;

/**
 * 作用描述
 *
 * @author doveylovey
 * @version v1.0.0
 * @email 1135782208@qq.com
 * @date 2025年04月02日
 */
public interface UserServiceByDatabaseClient {
    /**
     * 查询单条记录
     */
    Mono<User> findUserById(Long id);

    /**
     * 查询多条记录
     */
    Flux<User> findAllUsers1();

    /**
     * 查询多条记录：使用自定义行映射器
     */
    Flux<User> findAllUsers2();

    /**
     * 插入数据并返回生成的ID
     */
    Mono<Long> insertUser1(User user);

    /**
     * 插入数据
     */
    Mono<Long> insertUser2(User user);

    /**
     * 更新数据
     */
    Mono<Long> updateUser(User user);

    /**
     * 删除数据
     */
    Mono<Long> deleteUser(Long id);

    /**
     * 使用命名参数绑定：bind("param", value)，SQL 中使用 :param 占位符
     */
    Flux<User> findUsersByNameAndEmail1(String name, String email);

    /**
     * 使用位置参数绑定：bind(0, value)，SQL 中使用 $index 占位符
     */
    Flux<User> findUsersByNameAndEmail2(String name, String email);

    /**
     * 批量插入
     */
    Flux<Long> batchInsertUsers(List<User> users);

    /**
     * 批量修改
     */
    Mono<Long> batchUpdateUsers(List<User> users);

    /**
     * 事务管理
     */
    Flux<Void> executeInTransaction(Long fromId, Long toId, BigDecimal amount);

    /**
     * 带事务的批量操作
     */
    Flux<Integer> batchInsertWithTransaction(List<User> users);
}
